using BepuUtilities;
using System.Diagnostics;
using System.Runtime.CompilerServices;
#if MYCODE
using BepuUtilities.Vectors;
#else
using System.Numerics;
#endif
namespace BepuPhysics.Trees
{
    partial struct Tree
    {
        /// <summary>
        /// 递归地将节点的每个父节点的边界框重新调整到根。
        /// </summary>
        /// <param name="nodeIndex">要为其传播节点更改的节点。</param>
        public unsafe void RefitForNodeBoundsChange(int nodeIndex)
        {
            // 请注意,不会尝试重新调整根节点。请注意,根节点是唯一可以具有小于2个子节点的节点。
            ref var node = ref Nodes[nodeIndex];
            ref var metanode = ref Metanodes[nodeIndex];
            while (metanode.Parent >= 0)
            {
                // 计算此节点的新边界框。
                ref var parent = ref Nodes[metanode.Parent];
                ref var childInParent = ref Unsafe.Add(ref parent.A, metanode.IndexInParent);
                BoundingBox.CreateMerged(node.A.Min, node.A.Max, node.B.Min, node.B.Max, out childInParent.Min, out childInParent.Max);
                node = ref parent;
                metanode = ref Metanodes[metanode.Parent];
            }
        }

        // TODO：递归方法有点愚蠢。我们早期的非递归实现不是很好,但是我们可以做得更好。
        // 如果我们最终更改了内存布局,情况尤其如此。如果我们回到每个关卡的连续数组,改装就变得微不足道了。
        // 不过,只有在事实证明对执行的其他部分有用时,才会发生这种情况-以自检为代价来优化重新配置将是一个糟糕的想法。
        unsafe void Refit(int nodeIndex, out Vector3 min, out Vector3 max)
        {
            Debug.Assert(leafCount >= 2);
            ref var node = ref Nodes[nodeIndex];
            ref var a = ref node.A;
            if (node.A.Index >= 0)
            {
                Refit(a.Index, out a.Min, out a.Max);
            }
            ref var b = ref node.B;
            if (b.Index >= 0)
            {
                Refit(b.Index, out b.Min, out b.Max);
            }
            BoundingBox.CreateMerged(a.Min, a.Max, b.Min, b.Max, out min, out max);
        }

        public unsafe void Refit()
        {
            // 改装没有内部节点的树没有意义！
            if (leafCount <= 2)
                return;
            Refit(0, out var rootMin, out var rootMax);
        }



    }
}
